SpringBoot WebFlux 入门案例
为什么要使用WebFlux
1.WebFlux异步编程,拥有更好的性能
2.WebFlux完全基于java8开发,在编写代码时可以更加简洁明了
例如(官网图):
以前的风格
WebFlux风格
WebFlux入门案例
WebFlux主要基于Reacotr,下面代码一段入门demo,分别使用Mono和Flux
代码示例:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
publicclassUser{
privateInteger userId;
privateString username;
}
@RestController
@RequestMapping("/user")
public class UserController {
private Map<Integer, User> userMap = new HashMap<>();
@PostConstruct
public void init(){
userMap.put(1,new User(1,"zhangsan"));
userMap.put(2,new User(2,"lisi"));
}
@GetMapping("/find")
public Flux<User> findAll(){
return Flux.fromIterable(userMap.entrySet().stream()
.map(k -> k.getValue())
.collect(Collectors.toList()));
}
@GetMapping("/{id}")
public Mono<User> findByUserId(@PathVariable Integer id){
return Mono.just(userMap.get(id));
}
}
测试代码:
测试结果:
@RunWith(SpringRunner.class)
@WebFluxTest
publicclassSpringBootTestApplicationTests{
@Autowired
privateWebTestClient webTestClient;
@Test
publicvoid findAllTest(){
EntityExchangeResult<List<User>> exchangeResult = webTestClient.get().uri("/user/find")
.accept(MediaType.APPLICATION_JSON_UTF8)
.exchange()
.expectStatus().isOk()
.expectBodyList(User.class)
.returnResult();
exchangeResult.getResponseBody().forEach(System.out::println);
}
@Test
publicvoid findByIdTest(){
EntityExchangeResult<User> exchangeResult = webTestClient.get().uri("/user/{id}",2)
.accept(MediaType.APPLICATION_JSON_UTF8)
.exchange()
.expectStatus().isOk()
.expectBody(User.class)
.returnResult();
System.out.println(exchangeResult.getResponseBody().getUsername());
}
}
WebFlux Mono Flux使用场景
基于上面的示例,读者可能会有如下疑惑,什么时候使用Mono,什么时候使用Flux?
Mono:
在发布单个元素事件的时候使用Mono
Flux:
在发布多个元素事件的时候使用Flux
关注公众号
点击原文阅读更多